查找算法——折半查找

介绍

折半查找,又称作二分查找。这个查找的算法的特点,就是,要求数据要是有序的。

1 ,存储结构一定是顺序存储
2 ,关键字大小必须有序排列

然后,利用这组有序的数据之间的关系,来进行折半的查找。

比方说,这组数据是升序排列的。一开始,首先对比这组数据的中间的项与关键值(key)的关系。若是关键值(key)>中间值,则说明,关键值(key)在中间值的右侧,因此将这组数据的区间缩小为以中间值为最左侧的小区间。然后,继续用中间值进行比较,以此类推,最终肯定会找到在数组当中与之匹配的关键值,直到区间缩小为0还没找到,就只能是关键值(key)不在数组当中

算法分析

折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止。如果x< a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。一直这样搜索下去,时间复杂度为O(log N)

代码实现

/折半查找
void binarySearch(int *arr,int length,int key) {

    //数组左端
    int left = 0;
    //数组右端
    int right = length - 1;
    //中间
    int mid;

    //在左右指针交换之前,查找还没结束
    while (left <= right) {

        //更新中间的值
        mid = (left + right) / 2;

        //查找成功
        if (arr[mid] == key) {
            cout << "find it and its index is " << mid;
            return;
        }

        //若还没有找到,改变左右区间继续寻找
        if (arr[mid] < key)
            left = mid + 1;
        if (arr[mid] > key)
            right = mid - 1;

    }

    cout << "cannot find it" << endl;
    return;

}
  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
折半查找法也称为二分查找法,是一种针对有序表的查找算法。在折半查找法中,我们首先需要确定中间位置的下标,然后将待查找的值与该位置的值进行比较,如果相等则查找成功;如果待查找的值小于中间位置的值,则在前半部分继续查找;如果待查找的值大于中间位置的值,则在后半部分继续查找。重复以上步骤直到查找成功或者表中没有元素可查为止。 在这个问题中,我们需要查找键值32,因此我们首先需要将查找表排序,排好序之后的查找表为:[03, 07, 10, 15, 19, 20, 26, 32]。 接下来,我们可以使用折半查找法来查找键值32。我们首先将中间位置的下标设为 mid = (0 + 7) / 2 = 3,也就是中间位置的值为15。由于待查找的值32大于中间位置的值15,因此我们需要在后半部分继续查找。接下来,我们将查找范围缩小到[4, 7],并将中间位置的下标设为 mid = (4 + 7) / 2 = 5,也就是中间位置的值为20。由于待查找的值32大于中间位置的值20,因此我们需要在后半部分继续查找。接下来,我们将查找范围缩小到[6, 7],并将中间位置的下标设为 mid = (6 + 7) / 2 = 6,也就是中间位置的值为26。由于待查找的值32大于中间位置的值26,因此我们需要在后半部分继续查找。接下来,我们将查找范围缩小到[7, 7],并将中间位置的下标设为 mid = (7 + 7) / 2 = 7,也就是中间位置的值为32。由于待查找的值32等于中间位置的值32,因此我们查找成功。 在这个过程中,我们一共进行了4次比较,因此查找键值32的比较次数为4。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值